package com.shujia.wyh.day07.ketang;

/*
       二分查找（折半查找）
       4.二分法查找操作：使用二分法查找有序数组中元素。找到返回索引，不存在输出-1。
        分析：二分法查找的前提是数组有序。
        假如有一组数为3，12，24，36，55，68，75，88要查给定的值24.
        可设三个变量front，mid，end分别指向数据的上界，中间和下界，mid=（front+end）/2.　　
        1)开始令front=0（指向3），end=7（指向88），则mid=3（指向36）。因为mid>x，故应在前半段中查找。
        2)令新的end=mid-1=2，而front=0不变，则新的mid=1。此时x>mid，故确定应在后半段中查找。
        3)令新的front=mid+1=2，而end=2不变，则新mid=2，此时a[mid]=x，查找成功。
        如要查找的数不是数列中的数，例如x=25，当第三次判断时，x>a[mid]，
        按以上规律，令front=mid+1，即front=3，出现front>end的情况，表示查找不成功。
 */
public class BinarySearchDemo {
    public static void main(String[] args) {
        //定义一个数组，存储有序的数据，如果数据无序，要先做一次排序。
        int[] arr = {3, 12, 24, 36, 55, 68, 88};
        //定义要查找的数据
        int number = 66;

        //如果数组为空，直接返回-1，就表明查找失败
        if (arr == null) {
            System.out.println("数组为空");
        } else {
            //起始位置
            int front = 0;
            boolean flag = false;
            //结束位置
            int end = arr.length - 1;
            while (front <= end) {
                //计算中间元素的位置
                int mid = (front + end) / 2;
                int midValue = arr[mid];
                if (midValue == number) {
                    System.out.println("找到该元素，元素的下标索引是：" + mid);
                    flag = true;
                    break;
                } else if (midValue < number) {
                    front = mid + 1;
                } else {
                    end = mid - 1;
                }
            }
            if(!flag){
                System.out.println("元素"+number+"在数组中不存在。");
            }
        }


    }
}
